home *** CD-ROM | disk | FTP | other *** search
/ APDL Eductation Resources / APDL Eductation Resources.iso / programs / misc / cambridge / !Cambridge / !RunImage (.txt) < prev    next >
Encoding:
RISC OS BBC BASIC V Source  |  1993-07-15  |  13.6 KB  |  700 lines

  1.  >!RunImage
  2.  Cambridge Instruction Set Emulator
  3.  Version 1.01 (21st May 1993)         Copyright 
  4.  A. M. Pereira 1993
  5.  q% 256, main 4096, menu 1024, iconspace 4096
  6. ,iconend=iconspace+4096:iconptr=iconspace
  7.  make$(255), make(255)
  8. '!q%=1:q%!4=2:q%!8=3:q%!12=4:q%!16=0
  9.  "Wimp_Initialise",300,&4B534154,"Cambridge Emulator",q% 
  10.  wimp_ver,task_handle
  11. a       = 0
  12. x       = 0
  13. pc      = 0
  14. in      = 0
  15. out     = 0
  16. scrap   = 
  17. speed   = 20
  18. running = 
  19. quit    = 
  20. loadtemplates
  21. iconbar=
  22. iconbar
  23.  "OS_ReadMonotonicTime" 
  24.  time
  25.  "Wimp_PollIdle",,q%,time + speed 
  26.  event
  27.  event 
  28.  !      
  29.  0 : 
  30.  running 
  31. !(      
  32.  2 : 
  33.  "Wimp_OpenWindow",,q%
  34. ")      
  35.  3 : 
  36.  "Wimp_CloseWindow",,q%
  37.       
  38.  6 : 
  39. mouse
  40.       
  41.  7 : 
  42. dragover
  43.       
  44.  8 : 
  45. keypress
  46.       
  47.  9 : 
  48. menuselect
  49.       
  50.  17,18 : 
  51. message
  52.  quit
  53.  "Wimp_CloseDown",task_handle,&4B534154
  54.  "OS_Module",4,"CambridgeEm"
  55. iconbar
  56. !q%   = -1
  57. q%!4  = 0
  58. q%!8  = 0
  59. q%!12 = 68
  60. q%!16 = 68
  61. q%!20 = %11000000011010
  62. $(q%+24)="!cambridge"
  63.  "Wimp_CreateIcon",,q% 
  64.  iconbar
  65. =iconbar
  66. loadtemplates
  67.  "Wimp_OpenTemplate",,"<Camb$Dir>.Templates"
  68.  "Wimp_LoadTemplate",,main,iconptr,iconend,-1,"info",0 
  69.  ,,iconptr
  70.  "Wimp_CreateWindow",,main 
  71.  infohandle
  72.  "Wimp_LoadTemplate",,main,iconptr,iconend,-1,"save",0 
  73.  ,,iconptr
  74.  "Wimp_CreateWindow",,main 
  75.  savehandle
  76.  "Wimp_LoadTemplate",,main,iconptr,iconend,-1,"main",0
  77.  "Wimp_CreateWindow",,main 
  78.  mainhandle
  79.  "Wimp_CloseTemplate"
  80. !q%=savehandle
  81. q%!4=1
  82.  "Wimp_GetIconState",,q%
  83. $(q%!28)="Object"+
  84. mouse
  85.  q%!12 
  86. L    
  87.  -2         : 
  88. ibarclick
  89. M    
  90.  savehandle : 
  91. saveclick
  92. N    
  93.  mainhandle : 
  94. mainclick
  95. ibarclick
  96.  (q%!8 
  97.  %010)=%010 
  98. menu(q%!0-64,96+(5*44))
  99.  (q%!8 
  100.  %100)=%100 
  101. openmain
  102. menuheader(pointer,width,title$)
  103. menupointer=pointer
  104. $menupointer=title$+
  105. menupointer?12=7
  106. menupointer?13=2
  107. menupointer?14=7
  108. menupointer?15=0
  109. menupointer!16=width
  110. menupointer!20=44
  111. menupointer!24=0
  112. menupointer+=28
  113. menuitem(subm,flags,tflags,text$)
  114. menupointer!0=flags
  115. menupointer!4=subm
  116. menupointer!8=tflags
  117. $(menupointer+12)=text$+
  118. menupointer+=24
  119. menu(x,y)
  120. menuheader(menu+768, 192, "Speed")
  121. !menupointer=%10000100
  122. menupointer!4=-1
  123. menupointer!8=&07008111
  124. menupointer!12=menu+900
  125. menupointer!16=menu+920
  126. menupointer!20=8
  127. $(menu+900)=
  128. (speed/10)
  129. $(menu+920)="A0-9"
  130. menuheader(menu, 192, "Cambridge")
  131. menuitem(infohandle, 0, &7000031, "Info")
  132. menuitem(savehandle, 0, &7000031, "Save")
  133. menuitem(menu+768, 0, &7000031, "Speed")
  134. menuitem(-1, 0, &7000031, "Reset")
  135. menuitem(-1, 1<<7, &7000031, "Quit")
  136.  "Wimp_CreateMenu",,menu,x,y
  137. menuselect
  138.  !q% 
  139.  info
  140.  save
  141. setspeed
  142.  "Cambridge_Reset"
  143. 6           
  144. seticonstring(mainhandle, 32, "Start")
  145.            running=
  146.  4: quit=
  147.  "Wimp_GetPointerInfo",,q%
  148.  (q%!8 
  149.  %001)=%001 
  150. menu(x,y)
  151. message
  152.  q%!16 
  153.  0: quit=
  154. datasave
  155. filerreply
  156. filedrop
  157. endofsave
  158. endofsave
  159.  "Wimp_CreateMenu",,-1
  160. openmain
  161. !main=mainhandle
  162.  "Wimp_GetWindowState",,main
  163. main!28=-1
  164.  "Wimp_OpenWindow",,main
  165. dragover
  166.  dragsprite 
  167.  "DragASprite_Stop":dragsprite=
  168. !q%=savehandle
  169. q%!4=1
  170.  "Wimp_GetIconState",,q%
  171. name$=""
  172. pos=q%!28
  173.  ?pos>32 
  174.  name$+=
  175. (?pos):pos+=1
  176.  ?pos<33 
  177.  pos>(q%!28)+64
  178.  "Wimp_GetPointerInfo",,q%
  179. theirwindow=q%!12
  180. theiricon=q%!16
  181. x=q%!0
  182. y=q%!4
  183. q%!12=0
  184. q%!16=1
  185. q%!20=theirwindow
  186. q%!24=theiricon
  187. q%!28=!q%
  188. q%!32=q%!4
  189. q%!36=256
  190. q%!40=&ffd
  191. name$,".") 
  192.  name$=
  193. name$,
  194. name$,".")+1)
  195. $(q%+44)=name$+
  196. #length=(
  197. ((45+
  198. (name$))/4)+1)*4
  199. !q%=length
  200.  "Wimp_SendMessage",17,q%,theirwindow
  201. keypress
  202.  q%!0=savehandle 
  203.  q%!4=1 
  204.  q%!24=13 
  205. saveit
  206.  "Wimp_CreateMenu",,-1
  207.  "Wimp_ProcessKey",q%!24
  208. saveclick
  209.  q%!16 
  210.  0 : 
  211. dragpossible
  212.  1,2 : 
  213. saveit
  214.      
  215.  "Wimp_CreateMenu",,-1
  216. dragpossible
  217.  q%!8<>(%100*16) 
  218. !q%=savehandle
  219.  "Wimp_GetWindowState",,q%
  220. ox=q%!4-q%!20
  221. oy=q%!16-q%!24
  222. q%!4=0
  223.  "Wimp_GetIconState",,q%
  224. !q%=savehandle
  225. q%!4=5
  226. q%!8=ox+q%!8
  227. q%!12=oy+q%!12
  228. q%!16=ox+q%!16
  229. q%!20=oy+q%!20
  230. q%!24=0
  231. q%!28=0
  232. q%!32=&7FFFFFFF
  233. q%!36=&7FFFFFFF
  234.  "OS_Byte",161,28 
  235.  2)=2 
  236.  "DragASprite_Start",&C5,1,"file_ffd"+
  237. 0,q%+8
  238.    dragsprite=
  239.  "Wimp_DragBox",,q%
  240.    dragsprite=
  241. saveit
  242. !q%=savehandle
  243. q%!4=1
  244.  "Wimp_GetIconState",,q%
  245. name$=""
  246. pos=q%!28
  247.  ?pos>32 
  248.  name$+=
  249. (?pos):pos+=1
  250.  ?pos<33
  251. name$,".") 
  252. savefile(name$)
  253. reporterror(5,"To save, drag the icon to a directory viewer.",%001)
  254. filerreply
  255. theirref=q%!8
  256. name$=""
  257. pos=q%+44
  258.  ?pos>32 
  259.  name$+=
  260. (?pos):pos+=1
  261.  ?pos<33
  262. savefile(name$)
  263. q%!12=theirref
  264. q%!16=3
  265. q%!20=theirwindow
  266. q%!24=theiricon
  267. q%!28=x
  268. q%!32=y
  269. q%!36=256
  270. q%!40=&ffd
  271. $(q%+44)=name$+
  272. #length=(
  273. ((45+
  274. (name$))/4)+1)*4
  275. !q%=length
  276.  "Wimp_SendMessage",18,q%,theirwindow,theiricon
  277. setspeed
  278. sp=menu+900
  279.     a$=""
  280.  ?sp>47 
  281.  ?sp<58 
  282.  a$+=
  283.   sp+=1
  284.  ?sp<48 
  285.  sp>=menu+908
  286. speed=
  287. (a$)*10
  288. datasave
  289.  q%!40<>&ffd 
  290.  q%!40<>&fff 
  291. wimpscrap=
  292. "*q%!0=(
  293. ((48+
  294. ("<Wimp$Scrap>"))/4)+1)*4
  295. q%!12=q%!8
  296. q%!16=2
  297. q%!36=-1
  298. $(q%+44)="<Wimp$Scrap>"+
  299.  "Wimp_SendMessage",17,q%,q%!4
  300. scrap=
  301. wimpscrap
  302.  "XOS_ReadVarVal","Wimp$Scrap",q%+128,-1,0,0 
  303.  ,,,ws
  304.  ws=0 
  305. reporterror(5,"Wimp$Scrap is not defined",%110)
  306. filedrop
  307.  q%!40<>&ffd 
  308.  q%!40<>&fff 
  309. fd$=""
  310. fdchar$=""
  311.  X<256 
  312.  fdchar$<>
  313.    fdchar$=
  314. (q%?X)
  315.    X+=1
  316.    fd$+=fdchar$
  317. loadfile(fd$)
  318. q%!12=q%!8
  319. q%!16=4
  320. q%!20=-2
  321. q%!24=iconbar
  322.  "Wimp_SendMessage",17,q%,q%!4
  323.  scrap 
  324. E0   
  325.  "Wimp_StartTask","Delete <Wimp$Scrap>"
  326.    scrap=
  327. e(erl,err)
  328. q%!0=err
  329. L2$(q%+4)=
  330. $+" (internal error code "+
  331. (erl)+")"
  332.  "Wimp_ReportError",q%,%011,"Cambridge Emulator" 
  333.  ,fatal
  334.  fatal=2 
  335. loadfile(filename$)
  336.  "OS_File",5,filename$ 
  337.  ,,type,,length
  338. type=(type 
  339.  &FFF00)>>8
  340.  "Cambridge_CodeAddress" 
  341.  code
  342.  type=&ffd 
  343.  "Cambridge_Blank"
  344. W&   
  345.  "OS_File",&ff,filename$,code
  346. Y    
  347. assemble(filename$,code)
  348. savefile(filename$)
  349.  "Cambridge_CodeAddress" 
  350.  code
  351.  "OS_File",10,filename$,&ffd,,code,code+256
  352. reporterror(errnum,errmess$,errflags)
  353. q%!0=errnum
  354. $(q%+4)=errmess$
  355.  "Wimp_ReportError",misc,errflags,"Cambridge Emulator"
  356.  "Cambridge_CodeAddress" 
  357.  codeaddress
  358. olda=a:oldx=x:oldpc=pc
  359.  "Cambridge_Step" 
  360.  status, a, x, pc
  361.  status=1 
  362.   running=
  363. n   newinstr$="-- Finished --"
  364. seticonstring(mainhandle, 32, "Start")
  365.  "Cambridge_Reset"
  366. r#  newinstr$=
  367. "00"+
  368. ~pc,2)+" - "
  369.  codeaddress?pc 
  370. t?    
  371.  &3E: newinstr$+="3E "+
  372. "00"+
  373. ~(codeaddress?(pc+1)),2)
  374. u?              newinstr$+=" - LDA #&"+
  375. ~(codeaddress?(pc+1))
  376. v?    
  377.  &C6: newinstr$+="C6 "+
  378. "00"+
  379. ~(codeaddress?(pc+1)),2)
  380. w?              newinstr$+=" - ADD #&"+
  381. ~(codeaddress?(pc+1))
  382. x?    
  383.  &D6: newinstr$+="D6 "+
  384. "00"+
  385. ~(codeaddress?(pc+1)),2)
  386. y?              newinstr$+=" - SUB #&"+
  387. ~(codeaddress?(pc+1))
  388. z?    
  389.  &E6: newinstr$+="E6 "+
  390. "00"+
  391. ~(codeaddress?(pc+1)),2)
  392. {?              newinstr$+=" - SUB #&"+
  393. ~(codeaddress?(pc+1))
  394. |?    
  395.  &EE: newinstr$+="EE "+
  396. "00"+
  397. ~(codeaddress?(pc+1)),2)
  398. }?              newinstr$+=" - EOR #&"+
  399. ~(codeaddress?(pc+1))
  400. ~?    
  401.  &3A: newinstr$+="3A "+
  402. "00"+
  403. ~(codeaddress?(pc+1)),2)
  404. ?              newinstr$+=" - LDA  &"+
  405. ~(codeaddress?(pc+1))
  406. ?    
  407.  &32: newinstr$+="32 "+
  408. "00"+
  409. ~(codeaddress?(pc+1)),2)
  410. ?              newinstr$+=" - STA  &"+
  411. ~(codeaddress?(pc+1))
  412. ,    
  413.  &7E: newinstr$+="  7E  - LDA (X) "
  414. ,    
  415.  &77: newinstr$+="  77  - STA (X) "
  416. ,    
  417.  &86: newinstr$+="  86  - ADD (X) "
  418. ,    
  419.  &96: newinstr$+="  96  - SUB (X) "
  420. ,    
  421.  &A6: newinstr$+="  A6  - AND (X) "
  422. ,    
  423.  &AE: newinstr$+="  AE  - EOR (X) "
  424. ,    
  425.  &6F: newinstr$+="  6F  - TAX     "
  426. ,    
  427.  &7D: newinstr$+="  7D  - TXA     "
  428. ,    
  429.  &C9: newinstr$+="  C9  - INX     "
  430. ?    
  431.  &C3: newinstr$+="C3 "+
  432. "00"+
  433. ~(codeaddress?(pc+1)),2)
  434. ?              newinstr$+=" - JMP  &"+
  435. ~(codeaddress?(pc+1))
  436. ?    
  437.  &CA: newinstr$+="CA "+
  438. "00"+
  439. ~(codeaddress?(pc+1)),2)
  440. ?              newinstr$+=" - JEQ  &"+
  441. ~(codeaddress?(pc+1))
  442. ?    
  443.  &C2: newinstr$+="C2 "+
  444. "00"+
  445. ~(codeaddress?(pc+1)),2)
  446. ?              newinstr$+=" - JNE  &"+
  447. ~(codeaddress?(pc+1))
  448. ,    
  449.  &00: newinstr$+="  00  - NOP     "
  450. ,    
  451.  &76: newinstr$+="  76  - HLT     "
  452. seticonstring(mainhandle, 4, newinstr$)
  453.  olda<>a 
  454. seticonnumber(mainhandle, 10, a)
  455.  oldx<>x 
  456. seticonnumber(mainhandle, 11, x)
  457. oldin=in:oldout=out
  458.  "Cambridge_ReadIOState" 
  459.  in, out
  460.  oldin<>in 
  461. seticonnumber(mainhandle, 21, in)
  462.  oldout<>out 
  463. seticonnumber(mainhandle, 0, out)
  464.  bit=7 
  465.  oldin<>in 
  466.  (in 
  467.  2^bit)>0 
  468. 0      
  469. selecticon(mainhandle, 13+(7-bit), 
  470.         
  471. 0      
  472. selecticon(mainhandle, 13+(7-bit), 
  473.         
  474.  oldout<>out 
  475.  (out 
  476.  2^bit)>0 
  477. 0      
  478. selecticon(mainhandle, 23+(7-bit), 
  479.         
  480. 0      
  481. selecticon(mainhandle, 23+(7-bit), 
  482.         
  483. mainclick
  484.  q%!16 
  485.  32: 
  486.  running 
  487. 4    
  488. seticonstring(mainhandle, 32, "Start")
  489.                running=
  490. 3    
  491. seticonstring(mainhandle, 32, "Stop")
  492.                running=
  493.         
  494.  13,14,15,16,17,18,19,20: 
  495.  "Cambridge_ReadIOState" 
  496. $    c=a 
  497.  (2^(7 - (q%!16 - 13)))
  498. %    
  499.  "Cambridge_SetIOState",c,b
  500.  c<a 
  501. +      
  502. selecticon(mainhandle, q%!16, 
  503.         
  504. +      
  505. selecticon(mainhandle, q%!16, 
  506.         
  507. seticonstring(w, i, s$)
  508.     !q%=w
  509. q%!4=i
  510.  "Wimp_GetIconState",,q%
  511. $(q%!28)=s$
  512.     !q%=w
  513. q%!4=i
  514. q%!8=0:q%!12=0
  515.  "Wimp_SetIconState",,q%
  516. seticonvalid(w, i, v$)
  517.     !q%=w
  518. q%!4=i
  519.  "Wimp_GetIconState",,q%
  520. $(q%!32)=v$
  521.     !q%=w
  522. q%!4=i
  523. q%!8=0:q%!12=0
  524.  "Wimp_SetIconState",,q%
  525. seticonnumber(w, i, n)
  526. seticonstring(w, i, "&"+
  527. "00"+
  528. ~n,2))
  529. selecticon(w, i, select)
  530.     !q%=w
  531. q%!4=i
  532.  select 
  533.   q%!8=1<<21:q%!12=1<<21
  534.   q%!8=0:q%!12=1<<21
  535.  "Wimp_SetIconState",,q%
  536. assemble(filename$, assembleto)
  537. make$()=""
  538. make()=0
  539. nmade=0
  540. (filename$)
  541.  pass=0 
  542.   p%=assembleto
  543.     word$=
  544. getword
  545.  word$ 
  546. *      
  547.  "MAKE" : make$(nmade)=
  548. getword
  549. 0                    make(nmade) =
  550. getword)
  551.                      nmade+=1
  552.       
  553.  "LDA"  : 
  554.       
  555.  "STA"  : 
  556.       
  557.  "ADD"  : 
  558.       
  559.  "SUB"  : 
  560.       
  561.  "AND"  : 
  562.       
  563.  "EOR"  : 
  564. "      
  565.  "TAX"  : ?p%=&6F:p%+=1
  566. "      
  567.  "TXA"  : ?p%=&7D:p%+=1
  568. "      
  569.  "INX"  : ?p%=&C9:p%+=1
  570.       
  571.  "JMP"  : 
  572.       
  573.  "JEQ"  : 
  574.       
  575.  "JNE"  : 
  576.        
  577.  "NOP"  : ?p%=0:p%+=1
  578. "      
  579.  "HLT"  : ?p%=&76:p%+=1
  580.       
  581.  "DEFB" : 
  582.         
  583. +    
  584. word$, 1, 1)="." 
  585. label(word$)
  586.  word$="END"
  587. label(w$)
  588. make$(nmade)=
  589. w$,2)
  590. make(nmade)=p%-assembleto
  591. nmade+=1
  592. value(exp$)
  593.  pass=0 
  594.   ans=0
  595.   ans=&FFF
  596.  l=0 
  597.  nmade-1
  598. %    
  599.  exp$=make$(l) 
  600.  ans=make(l)
  601.  ans=&FFF 
  602.  ans=
  603. (exp$)
  604. par$=
  605. getword
  606. par$,1,1) 
  607.  "#" : ?p%=&3E: p%?1=
  608. value(
  609. par$,2)): p%+=2
  610.  "X" : ?p%=&7E: p%+=1
  611. : ?p%=&3A: p%?1=
  612. value(par$): p%+=2
  613. par$=
  614. getword
  615. par$,1,1) 
  616.  "X" : ?p%=&77: p%+=1
  617. : ?p%=&32: p%?1=
  618. value(par$): p%+=2
  619. par$=
  620. getword
  621. par$,1,1) 
  622.  "#" : ?p%=&C6: p%?1=
  623. value(
  624. par$,2)):p%+=2
  625.  "X" : ?p%=&86: p%+=1
  626. par$=
  627. getword
  628. par$,1,1) 
  629.  "#" : ?p%=&D6: p%?1=
  630. value(
  631. par$,2)):p%+=2
  632.  "X" : ?p%=&96: p%+=1
  633. par$=
  634. getword
  635. par$,1,1) 
  636.  "#" : ?p%=&E6: p%?1=
  637. value(
  638. par$,2)):p%+=2
  639.  "X" : ?p%=&A6: p%+=1
  640. par$=
  641. getword
  642. par$,1,1) 
  643.  "#" : ?p%=&EE: p%?1=
  644. value(
  645. par$,2)):p%+=2
  646.  "X" : ?p%=&AE: p%+=1
  647. par$=
  648. getword
  649. O$?p%=&C3: p%?1=
  650. value(par$):p%+=2
  651. par$=
  652. getword
  653. T$?p%=&CA: p%?1=
  654. value(par$):p%+=2
  655. par$=
  656. getword
  657. Y$?p%=&C2: p%?1=
  658. value(par$):p%+=2
  659. getword
  660.  #f) 
  661.   w$="":got=
  662. `        
  663.       
  664.         w$=
  665.       
  666.  w$<>" " 
  667. (w$)>32 
  668.     got=
  669. f&    
  670.  w$=";" 
  671.  w$="\" 
  672.  #f) 
  673.       
  674.         w$=
  675.       
  676.       got=
  677. k        
  678. (w$)>95 
  679. (w$)<123 
  680.     w$=
  681. (w$)-32)
  682.  #f) 
  683. q        
  684.       c=
  685. s$      
  686.  c>96 
  687.  c<123 
  688.  c=c 
  689.       
  690.  c>32 
  691.  w$+=
  692.  c<33 
  693.   w$="END"
  694.   par$=
  695. getword
  696.  par$<>"." 
  697.  ?p%=
  698. value(par$):p%+=1
  699.  par$="."
  700.